﻿/*
 * Created by SharpDevelop.
 * User: Lousabit
 * Date: 05/10/2011
 * Time: 18:01
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Data;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.IO;
using System.Web;
using iTextSharp.text;
using iTextSharp.text.pdf;

using Business_Entity;
using Business_Logic;

namespace PetSoft.GUI.Ventas
{
	/// <summary>
	/// Description of GUIPedidoVenta.
	/// </summary>
	
	public partial class GUIPedidoVenta : Form
	{
		bool esNuevo;
		bool huboCambios;
		bool cambiarGrillaPadre;
		BEPedidoVenta pedidoVenta;
		List<BELineaPedidoProducto> listaLineasProductoEliminar;
		List<BELineaPedidoServicio> listaLineasServicioEliminar;
		private int idClienteGenerico;
		
		private void recargarInfo(){
			this.pedidoVenta = BLPedidoVenta.getPedidoCompletoById(this.pedidoVenta.Id);
			llenarCampos();
		}
		
		private bool HuboCambios{
			set{
				this.huboCambios = value;
				if (!huboCambios){
					this.pagarBTN.Enabled = BLInfo.esCajero();//true;
					avisoGuardarLBL.Visible = false;
				}else{
					if (!esNuevo){
						this.pagarBTN.Enabled = false;
						avisoGuardarLBL.Visible = true;
					}
				}
			}
			get{return this.huboCambios || this.cambiarGrillaPadre;}
		}
		
		public bool CambiarGrillaPadre{
			get{return this.huboCambios || this.cambiarGrillaPadre;}
		}
		
				
		public GUIPedidoVenta(BEPedidoVenta pedidoVenta)
		{
			try{
				//
				// The InitializeComponent() call is required for Windows Forms designer support.
				//
				InitializeComponent();
				
				idClienteGenerico = BLCliente.getIdClienteMaster();
				
				this.HuboCambios = false;
				
				this.cambiarGrillaPadre = false;
				listaLineasProductoEliminar = new List<BELineaPedidoProducto>();
				listaLineasServicioEliminar = new List<BELineaPedidoServicio>();
				
				this.pedidoVenta = pedidoVenta;
				
				if (this.pedidoVenta != null){
					esNuevo = false;
					recargarInfo();
				}else{
					editarBTN.Text = "Crear";
					
					idLBL.Visible = false;
					idTB.Visible = false;
					noClienteCHB.Visible = true;					
					
					pagarBTN.Visible = false;
					anularPedidoBTN.Visible = false;
					idTB.Enabled = false;
					estadoTB.Visible = false;
					estadoLBL.Visible = false;
					clienteTB.Enabled = false;
					
					this.pedidoVenta = new BEPedidoVenta(-1, new DateTime(0), null, null);
					esNuevo = true;
				}
			}catch(Exception ex){
				Utils.MessageError("Error al crear la ventana.");
			}
		}
		
		private void llenarCampos(){
			idTB.Text = pedidoVenta.Id.ToString();
			idTB.Enabled = false;
			
			clienteTB.Text = pedidoVenta.Cliente.Nombre;
			clienteTB.Enabled = false;
			
			estadoTB.Text = pedidoVenta.Estado.Descripcion;
			estadoTB.Enabled = false;
			
			fechaDTP.Enabled = false;
			
			buscarClienteBTN.Enabled = false;
			
			if(pedidoVenta.Estado.Id == 3){
				//pagado
				pagarBTN.Enabled = false; pagarBTN.Visible=false;
				editarBTN.Enabled = false;
				anularPedidoBTN.Enabled = false;
				calcularDescuento.Enabled = false;
				
				nuevoLineaProductoBTN.Enabled = false;
				eliminarBTN.Enabled = false;
				eliminarServicioBTN.Enabled = false;
				nuevoServicioBTN.Enabled = false;
				verBTN.Enabled = false;
				verServicioBTN.Enabled = false;
				
				buscarClienteBTN.Enabled = false;
				if( pedidoVenta.LineasPedidoProducto.Count>0 || pedidoVenta.LineasPedidoServicio.Count>0){
					documentoBTN.Visible=true;
				}
			}
			else {
				pagarBTN.Enabled=BLInfo.esCajero();
			}
			
			cargarGrid();
			
		}

		private void cargarGrid(){
			try{
				//llenar grid
				lineaProductoDGV.Rows.Clear();
				
				foreach(BELineaPedidoProducto a in pedidoVenta.LineasPedidoProducto){				
					lineaProductoDGV.Rows.Add();
					DataGridViewRow row = lineaProductoDGV.Rows[lineaProductoDGV.Rows.Count-1];
					row.Cells["N"].Value = pedidoVenta.LineasPedidoProducto.IndexOf(a);
					row.Cells["Producto"].Value = a.Producto.Nombre;
					row.Cells["Precio"].Value = a.PrecioUnitario;
					row.Cells["Cantidad"].Value = a.Cantidad;
					row.Cells["MontoDescuento"].Value = a.MontoDescuento;
					
					try{
						row.Cells["UnidadesDescuento"].Value = a.CantidadDescuento;
					}catch{}
					
					try{
						row.Cells["Descuento"].Value = a.Descuento.Descuento;
					}catch(Exception ex){
						row.Cells["Descuento"].Value = 0;
					}
					
					row.Cells["Total"].Value = a.PrecioTotal;
					
					int descPorc = 0;
					if (a.Descuento != null)
						descPorc = (int)a.Descuento.Descuento;
					
					row.Cells["Descuento"].Value = descPorc;
				}
				
				//Servicio mascota precio fecha
				lineaServiciosDGV.Rows.Clear();
				
				foreach(BELineaPedidoServicio a in pedidoVenta.LineasPedidoServicio){
					lineaServiciosDGV.Rows.Add();
					DataGridViewRow row = lineaServiciosDGV.Rows[lineaServiciosDGV.Rows.Count-1];
					
					row.Cells["NN"].Value = pedidoVenta.LineasPedidoServicio.IndexOf(a);
					row.Cells["Preciox"].Value = a.Precio;
					row.Cells["Mascota"].Value = a.Mascota.Nombre;
					row.Cells["Fecha"].Value = String.Format("{0:dd/MM/yyyy hh:mm tt}",a.Fecha);
					row.Cells["Servicio"].Value = a.Servicio.Descripcion;
					try{
						row.Cells["Descuentox"].Value = a.Descuento.Descuento;
					}catch(Exception ex){
						row.Cells["Descuentox"].Value = 0;
					}
					row.Cells["PrecioConDescuento"].Value = a.MontoConDescuento;
					
				}
				
				
				//TOTAL
				totalSinDescuentoTB.Text = pedidoVenta.MontoTotalSinDescuento.ToString();
				descuentoTB.Text = pedidoVenta.DescuentoTotal.ToString();
				totalConDescuentoTB.Text = pedidoVenta.MontoTotal.ToString();
				
				//LBLs cantidad
				cantidadProductosLBL.Text = ""+pedidoVenta.LineasPedidoProducto.Count+" líneas de producto.";
				cantidadServiciosLBL.Text = ""+pedidoVenta.LineasPedidoServicio.Count+" líneas de servicio.";

				
			}catch(Exception ex){
				Utils.MessageError("Error al cargar detalle del pedido.", ex);
			}
			
		}
		
		private void GUIPedidoVentaLoad(object sender, EventArgs e)
		{
			
		}
		
		void TextBox1TextChanged(object sender, EventArgs e)
		{
			
		}
		
		void DataGridView1CellContentClick(object sender, DataGridViewCellEventArgs e)
		{
			
		}
		
		void GroupBox3Enter(object sender, EventArgs e)
		{
			
		}
		
		void DataGridView2CellContentClick(object sender, DataGridViewCellEventArgs e)
		{
			
		}
		
		void ProductoLBLClick(object sender, EventArgs e)
		{
			
		}
		
		void GroupBox4Enter(object sender, EventArgs e)
		{
			
		}
		
		void VerBTNClick(object sender, EventArgs e)
		{
			BECliente cliente = pedidoVenta.Cliente;
			
			try{

				int i;
				
				//int i= (int)lineaProductoDGV.SelectedRows[0].Cells["N"].Value;
				List<int> ind = Utils.getCheckedIndexes(lineaProductoDGV, "Eliminar", "N");
				
				if (ind == null || ind.Count == 0){
					return;
				}
				
				if (ind.Count != 1){
					Utils.MessageAviso("Debe seleccionar una sola línea.");
					return;
				}
				else{
					i = ind[0];
				}
				
				GUILineaPedidoProducto v = new GUILineaPedidoProducto(
					pedidoVenta.LineasPedidoProducto[i],
					fechaDTP.Value, cliente);
				
				v.ShowDialog(this);
				
				if (v.HuboCambios){
					pedidoVenta.LineasPedidoProducto[i] = v.Linea;
					HuboCambios = true;
					recargarInfo();
				}
			}catch(Exception ex){
				Utils.MessageError("Error al tratar de ver detalle", ex);
			}
		}
		
		void PagarBTNClick(object sender, EventArgs e)
		{
		
			//el metodo guardarCambios() ya tiene try catch
			if (!Utils.MessagePregunta("¿Realmente desea pagar el pedido?")){
				return;
			}
						
			try{
			
				if (this.pedidoVenta.NoTieneLineas){
                   Utils.MessageAviso("El pedido no tiene ninguna línea");
                   return;
	           }
			
				foreach (BELineaPedidoProducto linProd in pedidoVenta.LineasPedidoProducto){
					BLProductoTienda prod = new BLProductoTienda();
					if (prod.getStockActual(BLInfo.TiendaActual.Id,linProd.Producto.Codigo)<linProd.Cantidad) 
					{
						Utils.MessageAviso("No existe suficiente "+ linProd.Producto.Nombre + " "+linProd.Cantidad+" \n,el stock actual es: "+prod.getStockActual(BLInfo.TiendaActual.Id,linProd.Producto.Codigo));
						return;
					}
					
				}
	           
	           //Business_Logic.BLVenta.pagaPedidoVenta(pedidoVenta);
	           GUIOpcionesPago op= new GUIOpcionesPago(this.pedidoVenta);
	           op.ShowDialog(this);
	           foreach (BELineaPedidoProducto linProd in pedidoVenta.LineasPedidoProducto){
	                   BLMovimiento mov=new BLMovimiento();
	                   BLProductoTienda prod = new BLProductoTienda();
	                   mov.nuevaSalidaProducto(BLInfo.TiendaActual.Id,linProd.Producto.Codigo,linProd.Cantidad);
	                   prod.actualizaStock(linProd.Producto.Codigo,BLInfo.TiendaActual.Id,prod.getStockActual(BLInfo.TiendaActual.Id,linProd.Producto.Codigo)-linProd.Cantidad);
	           }
	           
	           recargarInfo();
			}
	        catch(Exception ex){
	           	Utils.MessageError("Error al realizar el pago.", ex);
	        }
       }
		
		void AnularBTNClick(object sender, EventArgs e)
		{
			
			
			try{
				
				if (!Utils.MessagePregunta("¿Realmente desea eliminar el pedido?")){
					return;
				}
				
				BLPedidoVenta.anular(pedidoVenta);
				Utils.MessageAviso("Se ha anulado el pedido de venta correctamente.");
				
				Close();
				cambiarGrillaPadre = true;
				
			}catch(Exception ex){
				Utils.MessageError("Error al eliminar pedido.", ex);
				return;
			}
			
			
		}
		
		void GuardarBTNClick(object sender, EventArgs e)
		{
			if (!Utils.MessagePregunta("¿Realmente desea guardar los cambios?")){
				return;
			}
					
			guardarCambios();
			
		}
		
		private void guardarCambios(){
			try{
				
				
				if (this.pedidoVenta.NoTieneLineas){
					Utils.MessageAviso("El pedido no tiene ninguna línea");
					return;
				}
				
				if (!esNuevo){
					//guardar cambios hechos
					
					aplicarDescuentos();
					
					try{
						BLPedidoVenta.updateLineas(pedidoVenta, listaLineasProductoEliminar, listaLineasServicioEliminar);
						Utils.MessageInformation("Se ha modificado el pedido de Venta");
						
						this.HuboCambios = false;
						
						recargarInfo();
						
					}catch(Exception ex){
						Utils.MessageError("Error al guardar los cambios.", ex);
					}
				}else{
					
					aplicarDescuentos();
					
					try{
						pedidoVenta.Fecha = fechaDTP.Value;
						String msg = BLPedidoVenta.insertPedidoVenta(pedidoVenta);
							
						if (msg == ""){
							
							BLCliente bl = new BLCliente();
							BLMascota blm = new BLMascota();
							if(!bl.existeCliente(pedidoVenta.Cliente)){
								Utils.MessageAviso("El cliente ya no existe. No se pudo insertar el pedido.");
								return;
							}else{
								foreach(BELineaPedidoServicio ll in pedidoVenta.LineasPedidoServicio){
									if(!blm.existeMascota(ll.Mascota)){
										Utils.MessageAviso("La mascota "+ll.Mascota.Nombre+" ya no existe. No se pudo insertar el pedido.");
										return;
									}
								}
							}
							
							Utils.MessageInformation("Se insertó un nuevo pedido de venta.");
							this.Close();
						}else{
							Utils.MessageAviso(msg);
							return;
						}
						
					}catch(Exception ex){
						Utils.MessageError("Error al insertar pedido de venta\n", ex);
						return;
					}
				}
			}catch(Exception ex){
				Utils.MessageError("Error al guardar cambios.", ex);
				return;
			}
		}
		
		void BuscarClienteBTNClick(object sender, EventArgs e)
		{
			try{
				
				if (pedidoVenta.LineasPedidoServicio.Count != 0){
					if (!Utils.MessagePregunta("Existen servicios reservados para mascotas del cliente actual. Si busca otro cliente, estas reservas se borrarán. ¿Desea continuar?")){
						return;
					}else{
						//this.pedidoVenta.vaciarLineasServicio();
						cargarGrid();
					}
				}
				
				GUI.Ventas.GUIMantenimientoCliente v = new GUI.Ventas.GUIMantenimientoCliente(true);
				v.ShowDialog(this);
						
				BECliente cliente = v.ClienteSeleccionado;
				
				if (cliente != null){
					pedidoVenta.Cliente = cliente;
					clienteTB.Text = pedidoVenta.Cliente.Nombre+" "+
									pedidoVenta.Cliente.ApellidoPaterno;
				}
			}catch(Exception ex){
				Utils.MessageError("Error al buscar cliente.");
			}
		}

		
		void NuevoLineaProductoBTNClick(object sender, EventArgs e)
		{
					
			try{
				
				BECliente cliente = pedidoVenta.Cliente;
				
				if (cliente == null){
					Utils.MessageAviso("Primero seleccionar un cliente.");
					return;
				}
				
				GUILineaPedidoProducto v = new GUILineaPedidoProducto(null,fechaDTP.Value, cliente);
				v.ShowDialog(this);
				
				if (v.Linea != null){
					BELineaPedidoProducto linea = v.Linea;
					
					if (this.pedidoVenta.tieneProductoDeLinea(linea)){
						Utils.MessageAviso("El producto ya existe en otra línea.");
					}else{
						this.pedidoVenta.addLinea(linea);
						HuboCambios = true;
						cargarGrid();
					}
				}
				
			}catch(Exception ex){
				Utils.MessageError("Error al intentar agregar producto.", ex);
			}
		}
		
		void EliminarBTNClick(object sender, EventArgs e)
		{
			try{
				
				if(!Utils.MessagePregunta("¿Realmente desea eliminar las líneas seleccionadas?")){
					return;
				}
				
				//obtener indices marcados
				List<int> listaIndicesEliminar = new List<int>();
				
				
				foreach(DataGridViewRow row in lineaProductoDGV.Rows){
					DataGridViewCell elimCell = row.Cells["Eliminar"];
					if (elimCell.Value != null && (bool)(elimCell.Value) == true){
						listaIndicesEliminar.Add((int)row.Cells["N"].Value);
					}
									
				}
				
				if (listaIndicesEliminar.Count == 0) return;
				
				foreach(int ind in listaIndicesEliminar){
					if (pedidoVenta.LineasPedidoProducto[ind].Id != -1)
						listaLineasProductoEliminar.Add(pedidoVenta.LineasPedidoProducto[ind]);
				}
				
				pedidoVenta.removeLineasProducto(listaIndicesEliminar);
				HuboCambios = true;
				
			}catch(Exception ex){
				Utils.MessageError("Error al eliminar productos.", ex);
			}
			
			cargarGrid();
			
		}
		
		
		void EliminarServBTNClick(object sender, EventArgs e)
		{
			//obtener indices marcados
			try{
				
				if(!Utils.MessagePregunta("¿Realmente desea eliminar las líneas seleccionadas?")){
					return;
				}
				
				List<int> inds = Utils.getCheckedIndexes(lineaServiciosDGV, "Eliminarx", "NN");
								
				if (inds == null || inds.Count == 0) return;
				
				if (inds.Count > 1){
					Utils.MessageAviso("Seleccionar solo un servicio.");
					return;
				}
				
				listaLineasServicioEliminar = new List<BELineaPedidoServicio>();
				
				foreach(int ind in inds){
					if (pedidoVenta.LineasPedidoServicio[ind].Id != -1){
						//Utils.MessageAviso("XXX "+pedidoVenta.LineasPedidoServicio[ind].Id.ToString());
						listaLineasServicioEliminar.Add(pedidoVenta.LineasPedidoServicio[ind]);
						
					}
				}
				
				pedidoVenta.removeLineasServicio(inds);
				HuboCambios = true;
				
			}catch(Exception ex){
				Utils.MessageError("Error al eliminar servicios.", ex);
			}
			cargarGrid();
		}
		
		void CalcularDescuentoClick(object sender, EventArgs e)
		{
			aplicarDescuentos();
		}
		
		void aplicarDescuentos(){
			try{
				BLDescuento.aplicarDescuentos(pedidoVenta);
				Utils.MessageAviso("El descuento se ha calculado. El precio total es S/. "+pedidoVenta.MontoTotal.ToString());
			}
			catch(Exception ex){
				Utils.MessageError("Error al calcular descuento.", ex);
			}
			
			cargarGrid();
		}
		
		void NuevoServicioBTNClick(object sender, EventArgs e)
		{
			try{
				if (pedidoVenta.Cliente == null){
					Utils.MessageAviso("Primero seleccionar un cliente.");
					return;
				}
				
				GUILineaPedidoServicio v = new GUILineaPedidoServicio(null, GUILineaPedidoServicio.MODO_CREAR, this.pedidoVenta);
				v.ShowDialog(this);
							
				BELineaPedidoServicio linea = v.LineaPedidoServicio;
				
				if (v.HuboCambios && linea != null){
					pedidoVenta.addLinea(linea);
					HuboCambios = true;
					cargarGrid();
				}
			}
			catch(Exception ex){
				Utils.MessageError("Error al agregar nuevo servicio.", ex);
			}
			
		}
		
		void VerServicioBTNClick(object sender, EventArgs e)
		{
			try{
				List<int> inds = Utils.getCheckedIndexes(lineaServiciosDGV, "Eliminarx", "NN");
				
				if (inds.Count > 1){
					Utils.MessageAviso("Seleccionar solo un servicio.");
					return;
				}else if (inds.Count == 0){
					return;
				}
				
				int ind = inds[0];
				BELineaPedidoServicio s = pedidoVenta.LineasPedidoServicio[ind];
				GUILineaPedidoServicio v = new GUILineaPedidoServicio(s, GUILineaPedidoServicio.MODO_EDITAR, this.pedidoVenta);
				v.ShowDialog(this);
								
				if (v.HuboCambios && v.LineaPedidoServicio != null){
					pedidoVenta.LineasPedidoServicio[ind] = v.LineaPedidoServicio;
					
					HuboCambios = true;
					cargarGrid();
				}
				
			}catch(Exception ex){
				Utils.MessageError("Error al ver servicio.");
			}
					
			
		}
		
		public BEPedidoVenta PedidoVenta{
			get {return this.pedidoVenta;}
			set {this.pedidoVenta = value;}
		}
		
		
		void FechaDTPValueChanged(object sender, EventArgs e)
		{
			Utils.dateMenorQueNow(sender, e);
		}
		
		void AnularPedidoBTNClick(object sender, EventArgs e)
		{
			try{
				if (this.pedidoVenta.Estado.Id == 3){
					Utils.MessageAviso("Un pedido pagado no se puede eliminar.");
					return;
				}
				
				BLPedidoVenta.anular(this.pedidoVenta);
				this.cambiarGrillaPadre = true;
				this.huboCambios = true;
				
				Utils.MessageInformation("El pedido se ha anulado correctamente.");
				
				this.Close();
			}catch(Exception ex){
				Utils.MessageError("Error al eliminar productos.");
			}
			
		}
		
		void LineaServiciosDGVCellDoubleClick(object sender, DataGridViewCellEventArgs e)
		{
			try{
				Utils.checkDobleClick(lineaServiciosDGV, "Eliminarx");
			}catch(Exception ex){
				Utils.MessageError("Error al seleccionar línea de servicio.");
			}
		}
		
		void LineaProductoDGVCellDoubleClick(object sender, DataGridViewCellEventArgs e)
		{
			try{
				Utils.checkDobleClick(lineaProductoDGV, "Eliminar");
			}catch(Exception ex){
				Utils.MessageError("Error al seleccionar línea de producto.");
			}
		}
		
		
    	void DocumentoBTNClick(object sender, EventArgs e)
		{/*
			GUIMostrarDocVenta v = new GUIMostrarDocVenta(this.pedidoVenta);
			//v.ShowDialog();
			this.ventanaPopUp=v;
			this.ventanaPopUp.Closed += new System.EventHandler(this.cerrarPopUp);
			this.ventanaPopUp.ShowDialog();*/
			imprimeDocVenta(pedidoVenta);
		}
		public static void imprimeDocVenta(BEPedidoVenta pedido)
		{
			BEPedidoVenta pedidoPag= new BEPedidoVenta();
			pedidoPag = BLPedidoVenta.getPedidoCompletoById(pedido.Id);
			BEDocumentoVenta documento= new BEDocumentoVenta();
			BLCaja blcaja = new BLCaja();
			List<String []>  lista = new List<string[]>();
			try{
				documento= blcaja.gedDocumentoVenta(pedidoPag);
				string nomReport = "DocumentoVenta "+pedidoPag.Id.ToString();
				int cont = 1;
				String path = "..\\"+nomReport +".pdf";
				while (true)
				{
					if (File.Exists(path))
					{
						path = "..\\"+nomReport +"-"+ cont.ToString() + ".pdf";
						cont++;
					}
					else
					{
						break;
					}
				}
				Document doc = new Document(PageSize.A4);
				doc.AddCreationDate();
				PdfWriter.GetInstance(doc, new FileStream(path, FileMode.Create));
				doc.Open();
				//iTextSharp.text.Font fntTit = FontFactory.GetFont(FontFactory.COURIER_BOLD, 20, BaseColor.RED);
				iTextSharp.text.Font fntTit = FontFactory.GetFont(FontFactory.HELVETICA, 14, BaseColor.WHITE);
				iTextSharp.text.Font fntTab = FontFactory.GetFont(FontFactory.HELVETICA, 8, BaseColor.BLACK);
				//iTextSharp.text.Font fntTab = FontFactory.GetFont(FontFactory.COURIER, 8, BaseColor.BLUE);
				iTextSharp.text.Font fntRes = FontFactory.GetFont(FontFactory.COURIER, 7);
				iTextSharp.text.Font fntTab2 = FontFactory.GetFont(FontFactory.COURIER, 10, BaseColor.BLACK);
				
				PdfPTable tab = new PdfPTable(4);
				
				tab.TotalWidth = 440f;
				float[] widths = new float[] {80f,200f,80f, 80f};//, 90f, 90f, 90f, 90f};
				tab.SetWidths(widths);
				
				tab.LockedWidth = true;
				
				PdfPCell cell = new PdfPCell(Utils.getEncabezadoReporte(),true);
				cell.Colspan = 2;
				cell.HorizontalAlignment = 0;
				cell.BorderWidth=0;
				tab.AddCell(cell);
				cell = new PdfPCell(new Phrase(BLInfo.razonSocial,fntTit));
				cell.Colspan = 2;
				cell.HorizontalAlignment = 1;
				cell.BorderWidth=0;
				tab.AddCell(cell);
				
				
				cell = new PdfPCell(new Phrase(BLInfo.razonSocial,fntTit));
				cell.Colspan = 4;
				cell.HorizontalAlignment = 1;
				cell.BorderWidth=0;
				cell.BackgroundColor=BaseColor.BLACK;
				tab.AddCell(cell);
				
				//ESPACIO
				cell = new PdfPCell(new Phrase("",fntTit));
				cell.Colspan = 4;
				cell.HorizontalAlignment = 1;
				cell.BorderWidth=0;
				tab.AddCell(cell);
				
				//CLIENTE!!!
				PdfPCell cell2 = new PdfPCell(new Phrase("Cliente: ",fntTab));
				//cell2.Colspan = 2;
				cell2.HorizontalAlignment = Element.ALIGN_LEFT;//.ALIGN_CENTER;
				cell2.VerticalAlignment = Element.ALIGN_CENTER;
				cell2.BorderWidth=0;
				tab.AddCell(cell2); 
				
				if (documento.Tipo.Codigo.Equals("B"))
					cell2 = new PdfPCell(new Phrase(pedido.Cliente.Nombre + " "+ pedido.Cliente.ApellidoPaterno,fntTab));
				//cell2.Colspan = 2;
				else 
				cell2 = new PdfPCell(new Phrase(documento.RazonSocial,fntTab));
				cell2.HorizontalAlignment = Element.ALIGN_LEFT;//.ALIGN_CENTER;
				cell2.VerticalAlignment = Element.ALIGN_CENTER;
				//cell2.BorderWidthLeft=cell2.BorderWidthRight=cell2.BorderWidthTop=0;
				cell2.BorderWidth=0;
				tab.AddCell(cell2); 
				
				//RUC PETSOF
				cell2 = new PdfPCell(new Phrase("RUC "+ BLInfo.RUC,fntTab2));
				cell2.Colspan = 2;
				cell2.HorizontalAlignment = 1;//Element.ALIGN_CENTER;
				cell2.VerticalAlignment = 1;//Element.ALIGN_CENTER;
				cell2.BorderWidthBottom=0;
				tab.AddCell(cell2); 
				
				//ESPACIO
				cell2 = new PdfPCell(new Phrase("",fntTab2));
				cell2.Colspan = 2;
				cell2.HorizontalAlignment = 1;//Element.ALIGN_LEFT;//.ALIGN_CENTER;
				cell2.VerticalAlignment = 1;//Element.ALIGN_CENTER;
				cell2.BorderWidth=0;
				tab.AddCell(cell2);//tab.AddCell(cell2);tab.AddCell(cell2);
				
				cell2 = new PdfPCell(new Phrase("",fntTab2));
				cell2.Colspan = 2;
				cell2.HorizontalAlignment = Element.ALIGN_LEFT;//.ALIGN_CENTER;
				cell2.VerticalAlignment = Element.ALIGN_CENTER;
				cell2.BorderWidthTop=cell2.BorderWidthBottom=0;
				tab.AddCell(cell2); //;tab.AddCell(cell2);tab.AddCell(cell2)
				
				//NOMBRE DE TIPO DE DOCUMENTO CLIENTE
				if (documento.Tipo.Codigo.Equals("B"))
					cell2 = new PdfPCell(new Phrase("Documento: ",fntTab2));
				else
					cell2 = new PdfPCell(new Phrase("RUC: ",fntTab2));
				cell2.HorizontalAlignment = Element.ALIGN_LEFT;//.ALIGN_CENTER;
				cell2.VerticalAlignment = Element.ALIGN_CENTER;
				cell2.BorderWidth=0;
				//cell.Colspan = 2;
				tab.AddCell(cell2); //tab.AddCell(cell2);//tab.AddCell(cell2);
				
				if (documento.Tipo.Codigo.Equals("B"))
					cell2 = new PdfPCell(new Phrase(pedido.Cliente.DocumentoIdentidad,fntTab2));
				else
					cell2 = new PdfPCell(new Phrase(documento.Ruc,fntTab2));
				cell2.HorizontalAlignment = Element.ALIGN_LEFT;//.ALIGN_CENTER;
				cell2.VerticalAlignment = Element.ALIGN_CENTER;
				cell2.BorderWidth=0;
				//cell.Colspan = 2;
				tab.AddCell(cell2);
				
				//NOMBRE DE TIPO DE DOCUMENTO
				cell2 = new PdfPCell(new Phrase(documento.Tipo.Descripcion,fntTab2));
				cell2.Colspan = 2;
				cell2.HorizontalAlignment = 1;// Element.ALIGN_LEFT;//.ALIGN_CENTER;
				cell2.VerticalAlignment =1;// Element.ALIGN_CENTER;
				cell2.BorderWidthBottom=cell2.BorderWidthTop=0;
				tab.AddCell(cell2); 
				//ESPACIO
				cell2 = new PdfPCell(new Phrase("",fntTab2));
				cell2.Colspan = 2;
				cell2.HorizontalAlignment = Element.ALIGN_LEFT;//.ALIGN_CENTER;
				cell2.VerticalAlignment = Element.ALIGN_CENTER;
				cell2.BorderWidth=0;
				tab.AddCell(cell2); //tab.AddCell(cell2);tab.AddCell(cell2);
				
				cell2 = new PdfPCell(new Phrase("",fntTab2));
				cell2.Colspan = 2;
				cell2.HorizontalAlignment = Element.ALIGN_LEFT;//.ALIGN_CENTER;
				cell2.VerticalAlignment = Element.ALIGN_CENTER;
				cell2.BorderWidthTop=cell2.BorderWidthBottom=0;
				tab.AddCell(cell2); //;tab.AddCell(cell2);tab.AddCell(cell2)
				
				
				//NUMERO DE DOCUMENTO
				cell2 = new PdfPCell(new Phrase("",fntTab2));
				cell2.HorizontalAlignment = Element.ALIGN_LEFT;//.ALIGN_CENTER;
				cell2.VerticalAlignment = Element.ALIGN_CENTER;
				cell2.BorderWidth=0;
				tab.AddCell(cell2); tab.AddCell(cell2);//;tab.AddCell(cell2);
				
				cell2 = new PdfPCell(new Phrase(documento.ToString(),fntTab));
				cell2.Colspan = 2;
				cell2.HorizontalAlignment = Element.ALIGN_CENTER;
				cell2.VerticalAlignment = Element.ALIGN_CENTER;
				cell2.BorderWidthTop=0;
				tab.AddCell(cell2); 
				
				
				//ESPACIO
				cell = new PdfPCell(new Phrase("",fntTit));
				cell.Colspan = 4;
				cell.HorizontalAlignment = 1;
				cell.BorderWidth=0;//cell.Image=((System.Drawing.Image)(resources.GetObject("documentoBTN.Image")));
				tab.AddCell(cell);tab.AddCell(cell);
				
				
				cell2 = new PdfPCell(new Phrase("Cantidad",fntTab));
				cell2.HorizontalAlignment = Element.ALIGN_CENTER;
				cell2.VerticalAlignment = Element.ALIGN_CENTER;
				tab.AddCell(cell2);
				
				cell2 = new PdfPCell(new Phrase("Descripcion",fntTab));
				cell2.HorizontalAlignment = Element.ALIGN_LEFT;//.ALIGN_CENTER;
				cell2.VerticalAlignment = Element.ALIGN_CENTER;
				tab.AddCell(cell2);
				
				cell2 = new PdfPCell(new Phrase("Precio Unitario (S/.)",fntTab));
				cell2.HorizontalAlignment = Element.ALIGN_CENTER;
				cell2.VerticalAlignment = Element.ALIGN_CENTER;
				tab.AddCell(cell2);
				
				
				
				cell2 = new PdfPCell(new Phrase("Precio Total (S/.)",fntTab));
				cell2.HorizontalAlignment = Element.ALIGN_CENTER;
				cell2.VerticalAlignment = Element.ALIGN_CENTER;
				tab.AddCell(cell2);
				
				lista=llenaLista(documento);
				
				foreach (string[] fila in lista) {
						cell2 = new PdfPCell(new Phrase(fila[0],fntRes));
						cell2.HorizontalAlignment = Element.ALIGN_LEFT;//.ALIGN_CENTER;
						cell2.VerticalAlignment = Element.ALIGN_CENTER;
						tab.AddCell(cell2);
						cell2 = new PdfPCell(new Phrase(fila[1],fntRes));
						cell2.HorizontalAlignment = Element.ALIGN_LEFT;
						cell2.VerticalAlignment = Element.ALIGN_CENTER;
						tab.AddCell(cell2);
						cell2 = new PdfPCell(new Phrase(fila[2],fntRes));
						cell2.HorizontalAlignment = Element.ALIGN_CENTER;
						cell2.VerticalAlignment = Element.ALIGN_CENTER;
						tab.AddCell(cell2);
						cell2 = new PdfPCell(new Phrase(fila[3],fntRes));
						cell2.HorizontalAlignment = Element.ALIGN_CENTER;
						cell2.VerticalAlignment = Element.ALIGN_CENTER;
						tab.AddCell(cell2);
						
					}
					
					cell2 = new PdfPCell(new Phrase("",fntTab));
					cell2.HorizontalAlignment = Element.ALIGN_LEFT;//.ALIGN_CENTER;
					cell2.VerticalAlignment = Element.ALIGN_CENTER;
					cell2.BorderWidth=0;
					tab.AddCell(cell2);					
					tab.AddCell(cell2);

					cell2 = new PdfPCell(new Phrase("Precio Total",fntTab));
					cell2.HorizontalAlignment = Element.ALIGN_LEFT;//.ALIGN_CENTER;
					cell2.VerticalAlignment = Element.ALIGN_CENTER;
					tab.AddCell(cell2);
					
					cell2 = new PdfPCell(new Phrase(documento.Total.ToString(),fntTab));
					cell2.HorizontalAlignment = Element.ALIGN_LEFT;//.ALIGN_CENTER;
					cell2.VerticalAlignment = Element.ALIGN_CENTER;
					tab.AddCell(cell2);
					
					
					doc.Add(tab);
					doc.Close();
//					MessageBox.Show("Exportación exitosa", "Aviso");
					System.Diagnostics.Process.Start("AcroRd32.exe",path);
				//	this.Close();
				
			}
			catch (Exception ex)
			{
				MessageBox.Show("Exportación fallida: " + ex,"Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
			}
		}
		
		
		private static List<String []> llenaLista(BEDocumentoVenta documento){
			List<String []> lista = new List<string[]>();
			foreach (BELineaDocumentoVenta doc in documento.Lineas){
				String[] row0={doc.Cantidad.ToString(),doc.Descripcion,Math.Round(doc.PrecioUnitario,2).ToString(),(Math.Round((doc.PrecioUnitario*doc.Cantidad),2)).ToString()};
				lista.Add(row0);
			}
			return lista;
		}
		
		
		void GroupBox1Enter(object sender, EventArgs e)
		{
			
		}
		
		void NoClienteCHBCheckedChanged(object sender, EventArgs e)
		{
			if (noClienteCHB.Checked){
				
				this.pedidoVenta.Cliente = new BECliente(idClienteGenerico, "PETSOFT");
				this.clienteTB.Text = this.pedidoVenta.Cliente.Nombre;
				this.buscarClienteBTN.Enabled = false;
			}else{
				
				this.pedidoVenta.Cliente = null;
				this.clienteTB.Text = "";
				this.buscarClienteBTN.Enabled = true;
			}
		}
		
		void ClienteTBTextChanged(object sender, EventArgs e)
		{
			
			if ( (pedidoVenta.Cliente != null) && pedidoVenta.Cliente.Nombre.Equals("PETSOFT")){
				nuevoServicioBTN.Enabled = false;
				verServicioBTN.Enabled = false;
				eliminarServicioBTN.Enabled = false;
				ServiciosGB.Enabled = false;
			}else{
				nuevoServicioBTN.Enabled = true;
				verServicioBTN.Enabled = true;
				eliminarServicioBTN.Enabled = true;
				ServiciosGB.Enabled = true;
			}
		}
	}
}
